package com.ruoyi.water.domain.dto;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.Data;
import java.io.Serializable;

/**
 * 盛帆节能平台接口统一响应DTO
 * 匹配文档中 "success+code+total+message+data" 的响应结构
 * @param <T> data部分的数据类型
 */
@Data
@JsonIgnoreProperties(ignoreUnknown = true) // 忽略未知字段
public class ApiResponse<T> implements Serializable {
    private static final long serialVersionUID = 1L;

    /** 请求是否成功（文档约定） */
    private Boolean success;

    /** 状态码（文档约定，如200=成功） */
    private Integer code;

    /** 分页总数（仅分页请求有效） */
    private Integer total;

    /** 提示语（成功/失败信息） */
    private String message;

    /** 接口返回的核心数据（各接口结构不同） */
    private T data;

    /**
     * 创建失败的响应对象
     * @param code 错误状态码
     * @param message 错误提示信息
     * @param <T> 数据类型（失败时通常为null）
     * @return 失败的响应对象
     */
    public static <T> ApiResponse<T> fail(Integer code, String message) {
        ApiResponse<T> response = new ApiResponse<>();
        response.setSuccess(false);
        response.setCode(code);
        response.setMessage(message);
        // 失败时通常不需要返回数据和总数，设为null
        response.setData(null);
        response.setTotal(null);
        return response;
    }

    /**
     * 重载的fail方法，可自定义失败时的数据
     * @param code 错误状态码
     * @param message 错误提示信息
     * @param data 失败时需要返回的数据（可选）
     * @param <T> 数据类型
     * @return 失败的响应对象
     */
    public static <T> ApiResponse<T> fail(Integer code, String message, T data) {
        ApiResponse<T> response = fail(code, message);
        response.setData(data);
        return response;
    }
}
